<?
//Google Merchant https://support.google.com/merchants/

error_reporting(7);
$DEV_MODE = 0; //режим отладки
//-------------------------
//параметры для пошаговости скрипта
$stepInterval = 20;  //величина шага, секунд
$startTime = time();
//-------------------------
define("STOP_STATISTICS", "Y");
define("NO_KEEP_STATISTIC", true);
define('NO_AGENT_CHECK', true);

if(!$_SERVER["DOCUMENT_ROOT"] || $_SERVER["DOCUMENT_ROOT"] == '') //для crontab
{
	$_SERVER["DOCUMENT_ROOT"] = '/home/cenrmag46/data/www/centrmag.ru'; //боевой
}
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
// определим константу LOG_FILENAME, в которой зададим путь к лог-файлу
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/scripts/export/google/log_xml_google.txt"); 

if( $DEV_MODE )
{
	echo('Внимание! Включен режим отладки!<br />');
	$devlog = $_SERVER["DOCUMENT_ROOT"].'/scripts/export/google/devlog_google' . date('Ymd');
	$fp_dev = fopen($devlog, 'a');
}

if (!CModule::IncludeModule("iblock"))
{
	AddMessage2Log("error of including iblock module");  
	die('error of including iblock module');
}

if (!CModule::IncludeModule("catalog"))
{
	AddMessage2Log("error of including catalog module");  
	die('error of including catalog module');
}

//--------------------------------
$strExportErrorMessage = ""; //строка с ошибками
$SETUP_FILE_NAME = '/scripts/export/google/google.xml'; //формируемый файл
$SETUP_SERVER_NAME = 'www.centrmag.ru'; //хост


if (strlen($strExportErrorMessage)<=0)
{
	//проверка на права
	if (!$fp_xml = @fopen($_SERVER["DOCUMENT_ROOT"].$SETUP_FILE_NAME, "a"))
	{
		$strExportErrorMessage .= "Не удается открыть файл для записи\n";
	}
}

//--------------------------------
//формирование XML

//запрещенные элементы
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/not_show.php"))
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/not_show.php");	

if(!empty($NOT_SHOW)){
	$params = array(
		array(),
		array("SECTION_ID"=>$NOT_SHOW,"INCLUDE_SUBSECTIONS"=>"Y","ACTIVE"=>"Y"),
		false,
		false,
		array("ID"),
	);
	$allId = GetList($params,"36000");
	$allId = $allId["IDS"];
}
################################################

if (strlen($strExportErrorMessage)<=0)
{
	
	//фильтр для предложений
	$arElementFilter = Array("IBLOCK_ID" => IBLOCK_ID_CATALOG, "ACTIVE"=>"Y");
	
	//-------------------------
	//информация о предыдущих шагах хранится сериализованным массивом в файле google_array.php
	$FILE_ARRAY = $_SERVER["DOCUMENT_ROOT"]."/scripts/export/google/google_array.php";
	if($fp = fopen($FILE_ARRAY, "rb")) 
	{
		while (!feof($fp)) 
		{
			$buffer .= fgets($fp, 4096);
		}
		fclose($fp);
	}
	$XI = unserialize($buffer);


	//если не задан последний обработанный элемент - начало - сбросим счетчики и откроем тэги
	
	if (!isset($XI['lastId'])) { 
	    $XI['lastId'] = 0; // Последний отработанный элемент для пошаговости.
	    $XI['counter'] = 0;// счетчик элементов
	    $XI['price_counter'] = 0; //счетчик элементов, пропущенных из-за цены
	    $XI['picture_counter'] = 0; // счетчик элементов, пропущенных из-за картинки

	    $all_cnt = CIBlockElement::GetList(array('ID'=>'ASC'), $arElementFilter, array());
	    $XI['allCount'] = $all_cnt;

		if(!$DEV_MODE)
		{
			@fwrite($fp_xml, "<?xml version=\"1.0\"?>");
			@fwrite($fp_xml, "\n<rss xmlns:g=\"http://base.google.com/ns/1.0\" version=\"2.0\">\n");
			@fwrite($fp_xml, "<channel>\n");
			
			@fwrite($fp_xml, "<title>ЦентрМАГ - журналы формы подарки книги сувениры карты образцы примеры электротовары</title>\n");
			@fwrite($fp_xml, "<link>http://www.centrmag.ru</link>\n");
			@fwrite($fp_xml, "<description>Мы занимаемся производством журналов и бланков любой сложности и в любом исполнении. По желанию заказчика продукция ламинируется, прошнуровывается или делается в твердом переплете. Мы так же делаем журналы на заказ.</description>\n");

		}
	}
	
	//*****************************************//

	//массив отбираемых данных
	$arSelect = array("ID", "IBLOCK_ID", "NAME", "IBLOCK_SECTION_ID", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE", "DETAIL_TEXT", "DETAIL_TEXT_TYPE", "DETAIL_PICTURE", "DETAIL_PAGE_URL", "PROPERTY_RAZRESHENO_IZMENYAT_KOLICHESTVO_STRANITS");

	$db_res = CCatalogGroup::GetGroupsList(array("GROUP_ID"=>2));
	$arPTypes = array();
	while ($ar_res = $db_res->Fetch())
	{
		if (!in_array($ar_res["CATALOG_GROUP_ID"], $arPTypes))
		{
			$arPTypes[] = $ar_res["CATALOG_GROUP_ID"];
			$arSelect[] = "CATALOG_GROUP_".$ar_res["CATALOG_GROUP_ID"];
		}
	}
	
	$strWrite = ""; //строка с предложениями

	//*****************************************//
	//предложения
	$finalFilter = array_merge($arElementFilter, array('>ID' => $XI['lastId']));	
	$resEl = CIBlockElement::GetList(array('ID' => 'ASC'), $finalFilter, false, false, $arSelect);

	while ($arAcc = $resEl->GetNext())
	{
		//если элемент с запрещенной категории пропускаем
		if(in_array($arAcc["ID"],$allId)){
			$XI['counter_skip']++;
			continue;
		}
		
		if (strlen($SETUP_SERVER_NAME) <= 0)
		{
			die('ошибка - не задан хост');
		}
		else
		{
			$arAcc['SERVER_NAME'] = $SETUP_SERVER_NAME;
		}

		//производство - значит, товар выпускается на внутр типографии и на сайте рассчитывается в калькуляторе
		$code = 0; //код товара
		$PROIZVODSTVO = 0;
		$db_props = CIBlockElement::GetProperty(IBLOCK_ID_CATALOG, $arAcc['ID'], array("sort" => "asc"), Array("CODE" => "CML2_TRAITS"));
		while($ar_props = $db_props->Fetch())
		{
			if($ar_props['VALUE'] == 'Производство с/х')
			{
				$PROIZVODSTVO = 1;
			}elseif($ar_props['DESCRIPTION'] == 'Код')
			{
				$code = $ar_props['VALUE'];
			}
		}
		
				
		//наличие
		//1) Товары которые "Производства с/х" - можем смело указать, что в наличии.
		//2) Товары которые числятся на складе - тоже можем передовать
		//3) Все остальные товары "нет в налчии"
		
		if($PROIZVODSTVO == 1)
			$str_AVAILABLE = 'in stock';
		else
		{
			$str_QUANTITY = doubleval($arAcc["CATALOG_QUANTITY"]);
			if (($str_QUANTITY <= 0))
				$str_AVAILABLE = 'out of stock';
			else
				$str_AVAILABLE = 'in stock';			
		}
			
		//если это производство и разрешено изменять количество страниц, то цена минимальная 
		if($arAcc['PROPERTY_RAZRESHENO_IZMENYAT_KOLICHESTVO_STRANITS_VALUE'] && $PROIZVODSTVO == 1)
		{
			$XI['produce_counter']++;
			$minPriceCurrency = "RUR";
			$minPrice = 25; //минимальная цена за минимальное количество страниц, которая по умолчанию для всех журналов равна 25 руб
		}
		else{
			$minPrice = 0;
			$minPriceRUR = 0;
			$minPriceGroup = 0;
			$minPriceCurrency = "";
			for ($i = 0, $intCount = count($arPTypes); $i < $intCount; $i++)
			{
				if (strlen($arAcc["CATALOG_CURRENCY_".$arPTypes[$i]])<=0) continue;
				$minPrice = $arAcc["CATALOG_PRICE_".$arPTypes[$i]];
			}
		}

		if ($minPrice <= 0) {
			$XI['price_counter']++;
			$XI['counter_skip']++;
			
			if($DEV_MODE)
			{
				$tmp_name = $arAcc['NAME'];
				$tmp_id = $arAcc['ID'];
				if ($fp_dev) fwrite($fp_dev, "$tmp_id\t$tmp_name\n"); //запишем статистику по товарам без цен в лог
			}
			
			continue; 
		}

		if ('' == $arAcc['DETAIL_PAGE_URL'])
		{
			$arAcc['DETAIL_PAGE_URL'] = '/';
		}
		else
		{
			$arAcc['DETAIL_PAGE_URL'] = str_replace(' ', '%20', $arAcc['DETAIL_PAGE_URL']);
		}
		if ('' == $arAcc['~DETAIL_PAGE_URL'])
		{
			$arAcc['~DETAIL_PAGE_URL'] = '/';
		}
		else
		{
			$arAcc['~DETAIL_PAGE_URL'] = str_replace(' ', '%20', $arAcc['~DETAIL_PAGE_URL']);
		}

		$strTmpOff = "<item>\n";
		$strTmpOff.= "<g:id>".$arAcc['ID']."</g:id>\n";
		$strTmpOff.= "<title><![CDATA[(6+) ".substr($arAcc['NAME'], 0, 146)."]]></title>\n";
		
		if(strlen($arAcc["DETAIL_TEXT"]) > 1)
		{
			$strTmpOff.=
				"<description><![CDATA[".($arAcc["DETAIL_TEXT_TYPE"]=="html"?
					substr(strip_tags($arAcc["DETAIL_TEXT"]), 0, 500) : substr($arAcc["DETAIL_TEXT"], 0, 500)).
				"]]></description>\n";
		}
		elseif(strlen($arAcc["PREVIEW_TEXT"]) > 1)
		{
			$strTmpOff.=
				"<description><![CDATA[".($arAcc["PREVIEW_TEXT_TYPE"]=="html"?
					substr(strip_tags($arAcc["PREVIEW_TEXT"]), 0, 500) : substr($arAcc["PREVIEW_TEXT"], 0, 500)).
				"]]></description>\n";
		}
		else
		{
			$strTmpOff.=
				"<description><![CDATA[".$arAcc['NAME']."]]></description>\n";
		}
		
		$strTmpOff.= "<g:google_product_category>СМИ</g:google_product_category>\n";
		
		$product_type = '';
		if($arAcc['IBLOCK_SECTION_ID']){
			$sec = getAllParentsName($arAcc['IBLOCK_SECTION_ID'], true);
			if(is_array($sec) && !empty($sec))
			{
				$product_type = '';
				foreach($sec as $sec_name)
					$product_type .= ' &gt; '.$sec_name;
			}
		}
		if($product_type)
			$strTmpOff.= "<g:product_type>".$product_type."</g:product_type>\n"; //ваша категория товара
			
		$strTmpOff.= "<link>http://".$arAcc['SERVER_NAME'].htmlspecialcharsbx($arAcc["~DETAIL_PAGE_URL"])."</link>\n";
		
		if (intval($arAcc["DETAIL_PICTURE"])>0 || intval($arAcc["PREVIEW_PICTURE"])>0)
		{
			$pictNo = intval($arAcc["DETAIL_PICTURE"]);
			if ($pictNo <= 0) $pictNo = intval($arAcc["PREVIEW_PICTURE"]);

			$arPictInfo = CFile::GetFileArray($pictNo);
			if (is_array($arPictInfo))
			{
				if(substr($arPictInfo["SRC"], 0, 1) == "/")
					$strFile = "http://".$arAcc['SERVER_NAME'].implode("/", array_map("rawurlencode", explode("/", $arPictInfo["SRC"])));
				elseif(preg_match("/^(http|https):\\/\\/(.*?)\\/(.*)\$/", $arPictInfo["SRC"], $match))
					$strFile = "http://".$match[2].'/'.implode("/", array_map("rawurlencode", explode("/", $match[3])));
				else
					$strFile = $arPictInfo["SRC"];
				$strTmpOff.="<g:image_link>".$strFile."</g:image_link>\n";
			}
		}
		else //товары без картинки не отправляем
		{
			$XI['picture_counter']++;
			$XI['counter_skip']++;
			continue;
		}
		
		$strTmpOff.= "<g:condition>new</g:condition>\n"; //состояние - новый
		
		/*
		//наличие, зависит от количества на складе
		$str_QUANTITY = doubleval($arAcc["CATALOG_QUANTITY"]);
		$str_QUANTITY_TRACE = $arAcc["CATALOG_QUANTITY_TRACE"];
		if (($str_QUANTITY <= 0))
			$str_AVAILABLE = 'available for order';
		else
			$str_AVAILABLE = 'in stock';*/
		
		$strTmpOff.= "<g:availability>".$str_AVAILABLE."</g:availability>\n";
		
		$strTmpOff.= "<g:price>".$minPrice." RUB</g:price>\n";
			
		if($code)
			$strTmpOff.= "<g:mpn>".$code."</g:mpn>\n"; //код производителя
				
		$strTmpOff.= "</item>\n";
		
		$strWrite .= $strTmpOff;
		
		$XI['lastId'] = $arAcc['ID'];
        $XI['counter']++;
 		
 		//--------------------------
        // Прерывание по времени шага
        if ($stepInterval > 0 && (time() - $startTime) > $stepInterval) {
            break;
        }
		
		//if($XI['counter'] == 100) break; //для теста

	}
	
	//--------------------------------
  	//запись в файл
  	if(!$DEV_MODE)
	{
		@fwrite($fp_xml, $strWrite);
	}
	
  	//--------------------------------
  	//вывод текущей информации и закрывающего тэга
  	if ($arAcc != false) 
  	{

        AddMessage2Log("Обработано " . ($XI['counter'] + $XI['counter_skip']) . ' элементов, осталось ' . ($XI['allCount'] - $XI['counter_skip'] - $XI['counter']).". Запишем обработанные в файл."); 
        $END = 0; //флаг завершения работы - не завершено
  	}
  	else
  	{
  		$END = 1; //флаг завершения работы - завершено
  		AddMessage2Log("Формирование XML успешно завершено. Всего загружено объектов: " . $XI['counter'] . " из " . $XI['allCount'] . ". Пропущено из-за цены: ". $XI['price_counter'] . ". Пропущено из-за картинок: ". $XI['picture_counter']. ". Всего пропущено: ". $XI['counter_skip']);
  		
  		//закрываем теги
  		if(!$DEV_MODE)
  		{
  			@fwrite($fp_xml, "</channel>\n");
  			@fwrite($fp_xml, "</rss>\n");
  			@fclose($fp_xml);
		}
  	}
  	
  	//--------------------------------
  	//запись в файл лога
	if($END)
	{
		$SUCCESS = 1;
		AddMessage2Log('В XML google записано объектов: '.$XI['counter']. '. Записан последний шаг.');
	}
	else
	{
		AddMessage2Log('В XML google записано объектов: '.$XI['counter']. '. Переход на следующий шаг.');
	}   
  	//--------------------------------
  	
  	//--------------------------------
  	//проверка завершения работы
  	if($END)
  	{
        //сбросим счетчики
        $XI = array();

        //перезапишем XML-файл, если все успешно
        if($SUCCESS && !$DEV_MODE)
        {

			$newfile = $_SERVER["DOCUMENT_ROOT"]."/scripts/export/google/google_load.xml";
			
			if (copy($_SERVER["DOCUMENT_ROOT"].$SETUP_FILE_NAME, $newfile)) 
			{
				if(unlink($_SERVER["DOCUMENT_ROOT"].$SETUP_FILE_NAME))
				{
					AddMessage2Log('XML скопирован в файл. Работа скрипта завершена успешно.');
				}
				else
				{
					AddMessage2Log('XML скопирован. Ошибка удаления test');
				}
			}
			else
			{
				 AddMessage2Log('Ошибка копирования из test в xml');
			}
        }
        else
        {
	        AddMessage2Log('На момент завершения работы скрипта файл не был успешно сформирован');
        }
        
        
        //--------------------------------
		//удалим файл инициализации google_status.txt , чтобы loader больше не дергал генерацию
		$file_process = $_SERVER["DOCUMENT_ROOT"]."/scripts/export/google/google_status.txt";
		unlink($file_process);		  	
  	}
  	else
  	{
	  	//--------------------------------
		//разблокируем файл инициализации google_status.txt , чтобы loader мог запустить следующий шаг
		$file_process = $_SERVER["DOCUMENT_ROOT"]."/scripts/export/google/google_status.txt";
		$fp = fopen($file_process, "wb");
		fwrite($fp, '1');
		fclose($fp);
  	}
  	//--------------------------------
  	//сохраняем переменные в файл	
	if($fp = fopen($FILE_ARRAY, "wb")) 
	{
		$strData = serialize($XI);
		if(fwrite($fp, $strData))
			AddMessage2Log('Статус шага сохранен в файл');
		else
			AddMessage2Log('Не удалось сохранить статус шага в файл');
		fclose($fp);
	}
	else
	{
		AddMessage2Log('Не удалось открыть файл для сохранения статуса шага');
	}
  	
}
else
{
	d($strExportErrorMessage);
}

if( $DEV_MODE )
{
	fclose($fp_dev); //закрыли лог
}

//d('конец');
//d($XI);

//--------------------------------
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>